package com.example.ai.service.Impl;


import com.example.ai.entity.Good;
import com.example.ai.entity.Order;
import com.example.ai.entity.TodayRevenue;
import com.example.ai.entity.item;
import com.example.ai.mapper.OrderMapper;
import com.example.ai.service.orderService;
import com.example.ai.utils.CurrentHoler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 订单业务逻辑实现类
 * 处理订单创建、状态更新及统计等核心业务逻辑
 *
 * @author czwa
 */
@Service
@Slf4j
public class orderServiceImpl implements orderService {

    @Autowired
    private OrderMapper orderMapper;

    /**
     * 新增订单（包含库存扣减）
     * 1. 插入订单基本信息
     * 2. 更新商品库存
     * 3. 建立订单与商品的关联关系
     *
     * @param order 订单实体对象
     */
    @Override
    public void addOrder(Order order) {
        orderMapper.addOrder(order);          // 插入订单基本信息
        orderMapper.updateStock(order.getItems());  // 扣减商品库存
        orderMapper.addOrderGood(order);      // 记录订单商品关联
    }

    /**
     * 获取今日订单统计数据
     * 1. 查询今日营收、订单总数、已完成订单数
     * 2. 处理数据库查询结果为空的情况（默认值为0）
     *
     * @return 今日营收统计对象
     */
    @Override
    public TodayRevenue getTodayOrder() {
        Double todayRevenue = orderMapper.getTodayRevenue();
        todayRevenue = (todayRevenue == null) ? 0.0 : todayRevenue;  // 营收默认值处理

        Integer totalOrders = orderMapper.getTotalOrders();
        totalOrders = (totalOrders == null) ? 0 : totalOrders;        // 订单数默认值处理

        Integer completedOrders = orderMapper.getCompletedOrders();
        completedOrders = (completedOrders == null) ? 0 : completedOrders;  // 已完成订单默认值处理

        return new TodayRevenue(todayRevenue, totalOrders, completedOrders);
    }

    /**
     * 获取未完成订单列表（状态为已支付）
     *
     * @return 未完成订单列表
     */
    @Override
    public List<Order> getUnfinishedOrder() {
        return orderMapper.getUnfinishedOrder();
    }

    /**
     * 更新订单状态为已完成（3）
     *
     * @param id 订单ID
     */
    @Override
    public void updateOrder(Integer id) {
        orderMapper.updateOrder(id);
    }

    /**
     * 处理订单发货流程
     * 1. 根据订单ID获取商品列表
     * 2. 更新商品库存（可能涉及二次扣减或状态标记）
     * 3. 更新订单状态为已发货（2）
     *
     * @param id 订单ID
     */
    @Override
    public void updateOrderGood(int id) {
        List<Good> goods = orderMapper.getGoodsByOrderId(id);  // 获取订单商品列表
        orderMapper.updateGoodStock(goods);                    // 更新商品库存
        orderMapper.updateOrderStatus2(id);                    // 更新订单状态为已发货
    }

    /**
     * 根据ID查询订单详情
     *
     * @param orderId 订单ID
     * @return 订单实体对象
     */
    @Override
    public Order getById(int orderId) {
        return orderMapper.getById(orderId);
    }

    /**
     * 自动下单功能（含业务校验）
     * 1. 构建订单对象并设置用户ID
     * 2. 校验商品存在性和库存充足性
     * 3. 计算订单总金额和商品信息
     * 4. 执行下单流程（插入订单、更新库存、记录关联）
     *
     * @param items 订单商品项数组
     * @return 下单结果提示（成功或失败原因）
     */
    @Override
    public String autoAddOrder(item[] items) {
        // 构建订单基础信息
        Order order = new Order();
        Long currentUserId = CurrentHoler.getCurrentId();
        order.setUserId(Math.toIntExact(currentUserId));  // 设置下单用户ID
        order.setItems(items);                             // 设置订单商品项

        // 订单信息初始化
        StringBuilder information = new StringBuilder();
        double expend = 0;

        // 遍历商品项进行业务校验
        for (item i : items) {
            Good g = orderMapper.selectByName(i.getGoodName());

            // 商品不存在校验
            if (g == null) {
                return i.getGoodName() + "不存在";
            }

            // 库存充足性校验
            if (i.getQuantity() > g.getStock()) {
                return i.getGoodName() + "库存不足";
            }

            // 计算订单金额和构建商品信息
            expend += g.getPrice() * i.getQuantity();
            information.append(i.getGoodName()).append("x").append(i.getQuantity()).append(" ");
        }

        // 设置订单核心信息
        order.setExpend(expend);
        order.setInformation(information.toString());

        // 执行下单流程（数据库操作）
        orderMapper.addOrder(order);
        orderMapper.updateStock(order.getItems());
        orderMapper.addOrderGood(order);

        return "下单成功：订单编号为" + order.getId();
    }
}